package com.db.curd;

import java.lang.reflect.*;
import java.util.ArrayList;
import java.util.List;
 
public class FieldOp {
    /**
     * 获得javaBean Class中的属性（不包含继承来的）
     * @param beanClass
     * @return<BR>
     * 以字符串数组的形式返回
     */
    public static String[]  getAttributeNames(Class beanClass) {  
        Field[] temp=beanClass.getDeclaredFields();
        String [] fieldString=new String[temp.length];
        for(int i=0;i<temp.length;i++){
            fieldString[i] = temp[i].toString().substring(temp[i].toString().lastIndexOf(".") + 1,
                    temp[i].toString().length());
        }
        return fieldString;
    }
    /**
     * 根据传进来的属性名字符串的字符串数组整合好一个用于插入操作的语句
     * <BR>id不是default的
     * @param tableName
     * @param fields
     * @return
     */
    public static String getInsertSQLNoDefaultId(String tableName, String[] fields) {  
        StringBuilder sql = new StringBuilder("INSERT INTO " + tableName + " (");  
       
        for (int i = 0; i < fields.length; i++) {  
            if (i != (fields.length - 1))  
                sql.append(fields[i] + ",");  
            else 
                // 最后的一个字段  
                sql.append(fields[i]).append(" ) VALUES (");  
        }  
        for (int i = 0; i < fields.length; i++) {  
            if (i != (fields.length - 1))  
                sql.append("?,");  
            else 
                sql.append("?)");  
        }  
       
        return sql.toString();  
    }
    /**
     * 根据传进来的属性名字符串的字符串数组整合好一个用于插入操作的语句
     * <BR>id是default的
     * @param tableName
     * @param feilds
     * @return
     */
    public static String getInsertSQLWithDefault(String tableName, String[] feilds) {  
        StringBuilder sql = new StringBuilder("INSERT INTO " + tableName + " (");  
       
        for (int i = 0; i < feilds.length; i++) {  
            if (i != (feilds.length - 1))  
                sql.append(feilds[i] + ",");  
            else 
                // 最后的一个字段  
                sql.append(feilds[i]).append(" ) VALUES (default");  
        }  
        for (int i = 1; i < feilds.length; i++) {  
            if (i != (feilds.length - 1))  
                sql.append("?,");  
            else 
                sql.append("?)");  
        }  
       
        return sql.toString();  
    }
    /**
     * 把属性名的第一个字母设置成大写，方便被调用<BR>
     * 达到将属性和相应的get 、set方法对应<BR>
     * 反射机制得到的属性和get和set方法是不对应的<BR>所以自己处理
     * @param field
     * @return
     */
    public static String UpFirst(String field){
        return field.substring(0, 1)
        .toUpperCase()+field.substring(1);
    }
    /**
     * 根据传进来的属性名和方法数组，将setter方法对应相应的属性<BR>
     * 
     * 
     * @param field
     * @param methods
     * @return
     */
    public static Method[] alignSetters(String[] fields, Method[] methods) {
        if (fields.length < 1) {
            return null;
        } else {
            Method[] getters = new Method[fields.length];
            for (int i = 0; i < fields.length; i++) {
                for (Method method : methods) {
                    if (method.getName().indexOf(FieldOp.UpFirst(fields[i])) != -1
                            && method.getName().indexOf("get") != -1) {
                        getters[i] = method;
                    }
                }
 
            }
            return getters;
        }
    }
 
    public static Object[] invokeResut(String[] fields, Method[] getters, Object bean) {
        List ls = new ArrayList();
        if (bean == null) {
            return null;
        } else {
            for (int i = 0; i < getters.length; i++) {
                try {
                    ls.add(getters[i].invoke(bean));
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        return ls.toArray();
    }
}
